package offerbook;

import java.util.Arrays;

/**
 * 汇编语言中有一种移位指令叫做循环左移（ROL）。
 * 对于一个给定的字符序列S，请你把其循环左移K位后的序列输出。
 * 例如，字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果，即“XYZdefabc”。
 * <p>
 * {@link baseclass.l_string.Code02_数组循环移动K位结果}
 */
public class Code42_LeftRotateString {

    public static void main(String[] args) {
        String str = "12345";
        System.out.println(leftRotateString1(str, 2));
        System.out.println(new String(getKLeft(str.toCharArray(), 2)));
    }

    /**
     * 方式1：利用自身自带API,通过
     */
    public static String leftRotateString1(String str, int k) {
        if (str == null || str.length() == 0 || k < 0) {
            return str;
        }
        // 0 - k-1共k个
        String before = str.substring(0, k);
        String after = str.substring(k, str.length());
        return after + before;
    }

    /**
     * 方式2：旋转3次
     */
    public static char[] getKLeft(char[] chars, int k) {
        //先反转0~ k-1
        reverse(chars, 0, k - 1);
        //再反转k - len -1
        reverse(chars, k, chars.length - 1);
        System.out.println(Arrays.toString(chars));
        //再反转整体，得到的就是答案
        reverse(chars, 0, chars.length - 1);
        return chars;
    }

    //反转字符串
    public static char[] reverse(char[] chars, int start, int end) {
        for (; start < end; start++, end--) {
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
        }
        return chars;
    }
}
